package pe.gob.mininter.dirandro.vaadin.panel.bandeja;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import pe.gob.mininter.dirandro.model.Opcion;
import pe.gob.mininter.dirandro.model.Pericia;
import pe.gob.mininter.dirandro.service.PericiaService;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.panel.documento.PanelRegistroPericia;
import pe.gob.mininter.dirandro.vaadin.util.DirandroComponent;
import pe.gob.mininter.dirandro.vaadin.util.Injector;
import pe.gob.mininter.dirandro.vaadin.util.TablaFiltro;
import pe.gob.mininter.dirandro.vaadin.util.container.TablaFiltroIndexedContainer;
import pe.gob.mininter.dirandro.vaadin.util.container.TablaFiltroIndexedContainer.TipoComponente;
import pe.gob.mininter.dirandro.vaadin.util.event.TablaFiltroEnterEvent;
import pe.gob.mininter.dirandro.vaadin.util.listener.TablaFiltroEnterListener;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.event.Action;
import com.vaadin.event.Action.Handler;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

public class PanelBandejaPericias extends DirandroComponent implements TablaFiltroEnterListener, ClickListener {

	@AutoGenerated
	private VerticalLayout mainLayout;

	@AutoGenerated
	private TablaFiltro tblBandeja;

	@AutoGenerated
	private HorizontalLayout lytBotonera;

	@AutoGenerated
	private Button btnBuscar;

	//Muestra
	public static final String COLUMNA_EXPEDIENTE = "expediente";
	public static final String COLUMNA_TIPO_HR = "TipoHr";
	public static final String COLUMNA_HOJA_REMISION = "hojaRemision";
	public static final String COLUMNA_TIPO_MUESTRA= "tipoMuestra";
	public static final String COLUMNA_TIPO_MUESTRA_NOMBRE= "tipoMuestraNombre";
	public static final String COLUMNA_TIPO_MUESTRA_DESCRIPCION= "tipoMuestraDesc";
	//Pericia
	public static final String COLUMNA_ID = "id";
	public static final String COLUMNA_ESTADO = "estado";
	public static final String COLUMNA_FECHA_PERICIA = "fechaPericia";
	public static final String COLUMNA_PERICIA = "pericia";
	
	private static final Action RESPONDER_PERICIA= new Action("Responder Pericia");
	private static final Action[] ITEM_ACTIONS = new Action[] { RESPONDER_PERICIA };
	
	private Action[] action = new Action[] {};

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	

	

	/**
	 * 
	 */
	private static final long serialVersionUID = -3860689794611254325L;
	
	private TablaFiltroIndexedContainer container;
	
	private PericiaService periciaService; 
	
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	public PanelBandejaPericias(List<Opcion> acciones, String height) {
		super(acciones, height);
		
		buildMainLayout();
		setCompositionRoot(mainLayout);
		
		periciaService  = Injector.obtenerServicio(PericiaService.class);
		
		postConstruct();
	}

	@Override
	public void postConstruct() {
		container = new TablaFiltroIndexedContainer();
		
		container.addContainerProperty(COLUMNA_ID, Long.class, StringUtils.EMPTY, "Pericia", TipoComponente.TEXT, true, 100);
		container.addContainerProperty(COLUMNA_HOJA_REMISION, String.class, StringUtils.EMPTY, "Hoja de Remision", TipoComponente.TEXT, true, 140);
		container.addContainerProperty(COLUMNA_TIPO_MUESTRA, String.class, StringUtils.EMPTY, "Tipo de Muestra", TipoComponente.TEXT, true, 130);
		container.addContainerProperty(COLUMNA_TIPO_MUESTRA_NOMBRE, String.class, StringUtils.EMPTY, "Muestra", TipoComponente.TEXT, true, 180);
		//container.addContainerProperty(COLUMNA_TIPO_MUESTRA_DESCRIPCION, String.class, StringUtils.EMPTY, "Descripciom", TipoComponente.TEXT, true, 250);
		container.addContainerProperty(COLUMNA_ESTADO, String.class, StringUtils.EMPTY, "Estado", TipoComponente.TEXT, true, 120);
		container.addContainerProperty(COLUMNA_FECHA_PERICIA, String.class, StringUtils.EMPTY, "Fecha de la Pericia", TipoComponente.DATEPICKER, true, 180);
		container.addContainerProperty(COLUMNA_PERICIA, Pericia.class, null);
		
		tblBandeja.setContainerDataSource(container);
		tblBandeja.setColumnCollapsingAllowed(true);
		tblBandeja.setColumnReorderingAllowed(true);
		tblBandeja.setSelectable(true);
		tblBandeja.addListener((TablaFiltroEnterListener)this);
		
		tblBandeja.setImmediate(true);
		
		buscarHojaRemisiones(new HashMap<String, Object>());
		
		btnBuscar.addListener((ClickListener) this);
		
		tblBandeja.addListener(new ValueChangeListener() {

			/**
			 * 
			 */
			private static final long serialVersionUID = -7070222690010564544L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				
				Integer value = (Integer) event.getProperty().getValue();
				
				tblBandeja.removeAllActionHandlers();
				
				if (value != null) {
					action = ITEM_ACTIONS;
					asignaActionHandler();
				} 

				tblBandeja.requestRepaintTable();
			}
		});		
	}

	private void asignaActionHandler() {
		tblBandeja.addActionHandler(new Handler() {

			/**
			 * 
			 */
			private static final long serialVersionUID = -6373252406881569655L;

			@Override
			public void handleAction(Action action, Object sender, Object target) {

				if (action.equals(RESPONDER_PERICIA)) {
					
					Object objID = tblBandeja.getValue();
					
					Item item = container.getItem(objID);
					
					Pericia peri = (Pericia)item.getItemProperty(COLUMNA_PERICIA).getValue();
					
					PanelRegistroPericia panelRegistroPericia = new PanelRegistroPericia();
					panelRegistroPericia.setPericia( peri );
					Window wdHojaRemision = new Window();
					
					wdHojaRemision.setModal(false);
					wdHojaRemision.setResizable(false);
					wdHojaRemision.addComponent(panelRegistroPericia);
						
					wdHojaRemision.setCaption("Registro de Pericia");
					wdHojaRemision.setWidth("500px");
					getWindow().addWindow(wdHojaRemision);
					
				}
			}

			@Override
			public Action[] getActions(Object target, Object sender) {
				return action;
			}
		});
	}

	private void buscarHojaRemisiones(Map<String, Object> map) {
		
		List<Pericia> lPericias = periciaService.buscarBandeja(map);
		
		container.removeAllItems();
		int con = 0;
		if(lPericias!=null){
			for (Pericia peri : lPericias) {
				Item item = container.addItem(con++);
				
				item.getItemProperty(COLUMNA_ID).setValue(peri.getId());
				item.getItemProperty(COLUMNA_HOJA_REMISION).setValue(peri.getMuestra().getHojaRemision().getNumero());
				item.getItemProperty(COLUMNA_TIPO_MUESTRA).setValue( peri.getMuestra().getDroga()!=null?"Droga":"Especie");
				item.getItemProperty(COLUMNA_TIPO_MUESTRA_NOMBRE).setValue(peri.getMuestra().getDroga()!=null? HarecUtil.marcaModeloNombreToEmpty( peri.getMuestra().getDroga().getTipoDroga() ) : peri.getMuestra().getEspecie().getNombre());
				//item.getItemProperty(COLUMNA_TIPO_MUESTRA_DESCRIPCION).setValue(peri.getMuestra().getDescripcion());
				item.getItemProperty(COLUMNA_ESTADO).setValue( HarecUtil.valorNombreToEmpty(peri.getEstado()));
				item.getItemProperty(COLUMNA_FECHA_PERICIA).setValue(peri.getFechaPeritaje());
				item.getItemProperty(COLUMNA_PERICIA).setValue(peri);
				
			}
		
		}
			
	}

	@Override
	public void handleEnterAction(TablaFiltroEnterEvent event) {
		buscarHojaRemisiones(event.getDatos());
	}

	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnBuscar)) {
			buscarHojaRemisiones(tblBandeja.getValues());
		}
		
	}

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		mainLayout.setSpacing(true);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// lytBotonera
		lytBotonera = buildLytBotonera();
		mainLayout.addComponent(lytBotonera);
		
		// tblBandeja
		tblBandeja = new TablaFiltro();
		tblBandeja.setImmediate(false);
		tblBandeja.setWidth("100.0%");
		tblBandeja.setHeight("100.0%");
		mainLayout.addComponent(tblBandeja);
		mainLayout.setExpandRatio(tblBandeja, 1.0f);
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildLytBotonera() {
		// common part: create layout
		lytBotonera = new HorizontalLayout();
		lytBotonera.setImmediate(false);
		lytBotonera.setWidth("100.0%");
		lytBotonera.setHeight("-1px");
		lytBotonera.setMargin(false);
		
		// btnBuscar
		btnBuscar = new Button();
		btnBuscar.setCaption("Buscar");
		btnBuscar.setImmediate(true);
		btnBuscar.setWidth("-1px");
		btnBuscar.setHeight("-1px");
		lytBotonera.addComponent(btnBuscar);
		
		return lytBotonera;
	}

}
